package com.atguigu.config;

import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactory;
import com.atguigu.bean.Yellow;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.bean.Person;
import com.atguigu.condition.MyImplortSelector;
import com.atguigu.condition.MyImportBeanDefinitonRegistrar;
import com.atguigu.condition.WindowsCondition;
import org.springframework.context.annotation.*;

/**
 * @author gcq
 * @Create 2020-09-22
 */
//配置类 == 配置文件
@Conditional({WindowsCondition.class})
@Configuration
@Import({Color.class, Yellow.class, MyImplortSelector.class,MyImportBeanDefinitonRegistrar.class})
public class MainConfig2 {

  /*   给容器注册一个bean  类型为返回值，id默认是方法名作为id
     ConfigurableBeanFactory#SCOPE_PROTOTYPE
    	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
    	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
    	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
    	 * @see #value
     prototype 多实例
         ioc容器启动并不会去调用方法创建对象放在容器中
    每次获取的时候才会调用方法创建对象
     singleton单实例
            单实例默认值 ioc容器启动会调用方法创建对象放到ioc容器中
             以后每次获取就是直接从容器map.get()中拿
     request 同一次请求创建一个实例
     session 同一个session创建一个实例

     懒加载
        单实例bean 默认在容器启动的时候创建对象
        懒加载：启动容器不创建对象，第一次使用(获取)Bean创建对象，并初始化
    */
//    @Scope()
    @Bean
//    @Lazy
    public Person person() {
        System.out.println("从容器中拿到对象");
        return new Person("lisi",20);
    }
    /**
     * @Conditional({}) 按照一定的条件进行判断，满足条件给容器中注册bean
     * 系统widows 给容器中注册 bill
     * 系统linux 给容器注册 linus
     */
    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01() {
        return new Person("bill Gates",62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person02() {
        return new Person("linus",48);
    }
    /**
     * 给容器注册组件
     * 1、包扫描+组件标准注解(@Controller/@Service/@Repository)
     * 2、@Bean [导入的第三方包里面的组件]
     * 3、@Import[快速给容器导入一个组件]
     *      1、@Import(要导入到容器中的组件) 容器中就会自动注册这个组件，id默认是全类名
     *      2、@ImportSelector：返回需要导入的组建的全类名 数组
     *      3、ImportBeanDefinitionRegistrar 手动注册bean到容器中
     * 4、使用Spring提供的FactoryBean(工厂bean)
     *  1、默认获取到的是工厂bean调用getObject创建的对象
     *  2、要获取工厂Bean本身，需要给id前面加一个&
     *          &ColorFactory
     */

    @Bean("colorFactory")
    public ColorFactory colorFactory(){
        return new ColorFactory();
    }



}